package com.garen.common;

import java.util.List;
import java.util.Map;

/*
 * 基本的增删改查的实现
 */
public interface IBaseDao<T> {
	
	//
	Integer queryForInt(String sql,Map<String,Object> paramMap);
	
	//保存实体,自动判断新增还是修改
	int save(T obj);
	
	//批量保存实体,自动判断新增还是修改
	int saveAll(List<T> objlist);
	
	/*
	 * 新建,null字段忽略
	 * 返回改变的行数
	 */
	int add(T obj);
	
	/*
	 * 新建,null字段有效
	 * 返回改变的行数
	 */
	int addWithNull(T obj);
	
	/*
	 * 新建,null字段忽略,自增主键写入实体类中
	 * 返回改变的行数
	 */
	int addAndId(T obj);
	
	/*
	 * 新建,null字段有效,自增主键写入实体类中
	 * 返回改变的行数
	 */
	int addAndIdWithNull(T obj);
	
	/*
	 * 更新，根据主键修改
	 * null字段忽略
	 * 返回改变的行数
	 */
	int update(T obj);
	
	/*
	 * 更新，根据主键修改
	 * null字段同样修改
	 * 返回改变的行数
	 */
	int updateWithNull(T obj);
	
	/*
	 * 更新，根据field条件进行修改,field条件不能为空 !
	 * null字段不修改
	 * 返回改变的行数
	 */
	int updateByField(T obj,String field);
	
	/*
	 * 更新，根据field条件进行修改,field条件不能为空 !
	 * null字段同样修改
	 * 返回改变的行数
	 */
	int updateByFieldWithNull(T obj,String field);
	
	
	/*
	 * 实体删除，不为null的字段做为条件且条件不能为空 !
	 * 返回改变的行数
	 */
	int del(T obj);
	
	/*
	 * 通过主键删除
	 * 返回改变的行数
	 */
	int del(Integer id,Class<T> myclass);
	
	/*
	 * 查询个体,主键作为条件，且不能为空
	 */
	T get(Integer id,Class<T> myclass);
	
	/*
	 * 查询个体,不为Null的字段作为条件且条件不能为空 !
	 * 若查询出来多条，则默认取第一条 !
	 * 若无记录，返回null
	 */
	T get(T obj);
	
	/*=================无分页查询列表==================*/
	/*
	 * 查询所有记录
	 */
	List<T> getList();
	
	/*
	 * 查询列表,不为Null的字段作为条件且条件可以为空 !默认主键排序,升序.
	 * 若无记录，返回长度为0的List
	 */
	List<T> getList(T obj);
	
	/*
	 * 功能继承:List<T> getList(T obj);
	 * 加入排序参数
	 */
	List<T> getList(T obj,String orderBy);
		
	/*=================分页查询列表==================*/
	/*
	 * 分页查询列表,不为Null的字段作为条件且条件可以为空,默认排序
	 * 若无记录，返回长度为0的List
	 */
	List<T> getPageList(PageBean<T> pb,T obj);
	
	/*
	 * 功能继承List<T> getPageList(PageBean pb,T obj);
	 * 加入排序参数
	 */
	List<T> getPageList(PageBean<T> pb,T obj,String orderBy);

	//查询结果map结构 ,即一条记录
	T  queryForMap(String sql);
		
	//查询结果map结构 ,即一条记录
	T  queryForMap(String sql, Map<String, Object> paramMap);
		
	//查询结果map list结构
	List<T>  queryForList(String sql, Map<String, Object> paramMap);

	//查询结果map list结构
	List<T>  queryForList(String sql);

	int update(String sql, Map<String, ?> paramMap);
		
	//分页
	List<T>  queryPageForList(PageBean<T>pb,String sql,
			String pageSql,Map<String, Object> paramMap);
	
	//分页并自定义排序
	List<T>  queryPageForList(PageBean<T>pb,String sql,
				String pageSql,Map<String, Object> paramMap,String orderBy);

	List<Map<String, Object>> queryForListMap(String sql, Map<String, Object> paramMap);
		
}
